<?php
/* 
 * Sistema Fácil - Desenvolvimento rápido de softwares baseado em sentenças em português
 * Copyright (C) 2010 Rodrigo Caldeira de Paula Lima 
 * 
 * Este arquivo é parte do Sistema Fácil
 *
 * Sistema Fácil é um software livre; você pode redistribui-lo e/ou 
 * modifica-lo dentro dos termos da Licença Pública Geral GNU como 
 * publicada pela Fundação do Software Livre (FSF); na versão 2 da 
 * Licença, ou (na sua opnião) qualquer versão.
 * 
 * Este programa é distribuido na esperança que possa ser  util, 
 * mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer
 * MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
 * Licença Pública Geral GNU para maiores detalhes.
 *
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU
 * junto com este programa, se não, escreva para a Fundação do Software
 * Livre(FSF) Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
 * */

class GUI {
	var $menu;
	var $conteudo;
	var $template;
	var $configBase;
	var $tabelas;
	var $relatorios;
	var $migalha;
	var $renderizarTemplate;
	var $tabelaAtual;
	var $relatorioAtual;
	var $formRequestRenderizado;
	
	function __construct() {
		$this->template = "default";
		$this->renderizarTemplate = true;
		$this->paginaAtual = 1;
		$this->formRequestRenderizado = false;
	}
	
	function setConfigBase($configBase) {
		$this->configBase = $configBase;
		$this->tabelas = $this->configBase->tabelas;
		$this->relatorios = $this->configBase->relatorios;
	}
		
	function renderizar() {
		if ($this->verificarRequisicao()) {
			$this->renderizarMenu();
			$this->renderizarConteudo();
			$this->renderizarMigalha();
			if ($this->renderizarTemplate) {
				if ($this->tabelaAtual) {
					$this->conteudo = "<h1>" . $this->tabelaAtual->nome . "</h1>" . $this->conteudo;
				} else if ($this->relatorioAtual) {
					$this->conteudo = "<h1>" . $this->relatorioAtual->nome . "</h1>" . $this->conteudo;
				}
				$this->conteudo .= $this->renderizarFormRequest();
				include("Templates/" . $this->template . ".php");
			} else {
				echo $this->conteudo;
			}
		}
	}
	
	function renderizarFormRequest($filtro = false) {
		if (!$this->formRequestRenderizado) {
			$formRequest = "<form action='?' method='post' id='formRequest'>";
			$formRequest .= "<input type='hidden' name='Cadastro' id='Cadastro'/>";
			$formRequest .= "<input type='hidden' name='acao' id='acao'/>";
			$formRequest .= "<input type='hidden' name='id' id='id'/>";
			$formRequest .= "<input type='hidden' name='arquivo' id='arquivo'/>";
			$formRequest .= "<input type='hidden' name='pagina' id='pagina'/>";
			$formRequest .= "<input type='hidden' name='Relatorio' id='Relatorio'/>";
			if ($filtro) {
				$formRequest .= "##CAMPOS DE FILTRO##";
			}
			$formRequest .= "</form>";
			$this->formRequestRenderizado = true;
			return $formRequest;
		} else return "";
	}
	
	function renderizarMigalha() {
		$migalha = "<a href='/'>Home</a>";
		if ($this->tabelaAtual) {
			$migalha .= " &gt; <a href='#' onclick='javascript:request(\"" . $this->tabelaAtual->nome . "\",\"\",\"\");return false;'>" . $this->tabelaAtual->nome . "</a>";
		}
		if (isset($_GET['acao'])) {
			$migalha .= " &gt; " . $_GET['acao'];
		}
		if (isset($_GET['Relatorios'])) {
			$migalha .= " &gt; <a href='?Relatorios'>Relatórios</a>";
		}
		if ($this->relatorioAtual) {
			$migalha .= " &gt; <a href='#' onclick='javascript:request(\"\",\"\",\"\",\"\",\"\",\"" . $this->relatorioAtual->nome . "\");return false;'>" . $this->relatorioAtual->nome . "</a>";
		}
		$this->migalha = $migalha;
	}
	
	function renderizarMenu() {
		$bemVindo = "";
		if (isset($_SESSION['bemVindo'])) $bemVindo = $_SESSION['bemVindo'];
		$menu = "<div style='text-align: right'>Olá " . $bemVindo . "</div>";
		$menu .= "<ul>";
		$menu .= "<li><a href='?'>Home</a></li>";
		
		if ($this->configBase->tabelaParaRestricaoMenu && $this->configBase->tabelaParaAutenticacao) {
			$query = "SELECT COUNT(*) FROM `" . $this->configBase->tabelaParaRestricaoMenu->nome . "_X_menu`";
			$result = mysql_query($query, $this->configBase->conn);
			if (mysql_result($result, 0, 0) == 0) {
				$query = "SELECT id FROM `" . $this->configBase->tabelaParaRestricaoMenu->nome . "`";
				$result = mysql_query($query, $this->configBase->conn);
				while ($registro = mysql_fetch_array($result)) {
					$query = "INSERT INTO `" . $this->configBase->tabelaParaRestricaoMenu->nome . "_X_menu` VALUES ";
					foreach ($this->configBase->tabelas as $tabela) {
						$query .= "(" . $registro["id"] . ",'" . $tabela->nome . "',true,true,true),";
					}
					$query = substr($query, 0, strlen($query) - 1);
					mysql_unbuffered_query($query, $this->configBase->conn);
				}
			}
			
			$tabelas = array();
			$idRestricao = "";
			if ($this->configBase->tabelaParaAutenticacao->nome == $this->configBase->tabelaParaRestricaoMenu->nome) {
				$idRestricao = $_SESSION['id'];
			} else {
				foreach ($this->configBase->tabelaParaAutenticacao->campos as $campo) {
					if ($campo->tipoConfig == $this->configBase->tabelaParaRestricaoMenu->nome) {
						$query = "SELECT `" . $campo->nome . "` FROM `" . $this->configBase->tabelaParaAutenticacao->nome . "` WHERE id = " . $_SESSION['id'];
						//echo $query;
						$result = mysql_query($query, $this->configBase->conn);
						$idRestricao = mysql_result($result, 0);
						break;
					}
				}
			}
			$query = "SELECT menu FROM `" . $this->configBase->tabelaParaRestricaoMenu->nome . "_X_Menu` WHERE `" . $this->configBase->tabelaParaRestricaoMenu->nome . "Id` = " . $idRestricao;
			//echo $query;
			$result = mysql_query($query, $this->configBase->conn);
			while ($registro = mysql_fetch_array($result)) {
				foreach ($this->tabelas as $tabela) {
					if ($tabela->nome == $registro['menu']) {
						array_push($tabelas, $tabela);
						break;
					}
				}
			}
		} else {
			$tabelas = $this->tabelas;
		}
		foreach ($tabelas as $tabela) {
			$menu .= "<li><a href='#' onclick='javascript:request(\"" . $tabela->nome . "\",\"\",\"\"); return false;'>" . $tabela->nome . "</a></li>";
		}
		if (count($this->configBase->relatorios) > 0) {
			$menu .= "<li><a href='?Relatorios'>Relatórios</a></li>";			
		}
		$menu .= "<li><a href='?logout'>Sair</a></li>";
		$menu .= "</ul>";		
		$this->menu = $menu;
	}
	
	function verificarRequisicao() {
		if (isset($_SERVER["HTTP_REFERER"])) {
			$referer = $_SERVER["HTTP_REFERER"];
			$host = $_SERVER["HTTP_HOST"];
			$referer = str_replace("http://", "", $referer);
			$referer = substr($referer, 0, strpos($referer, "/"));
			if ($referer != $host) return false;
		}
		if (isset($_GET['logout'])) {
			unset($_SESSION['id']);
			unset($_SESSION['bemVindo']);
			unset($_SESSION['tabelaAutenticacao']);
		}
		foreach ($this->tabelas as $tabela) {
			if ($tabela->usarParaAutenticacao) {
				if (!isset($_SESSION['id'])) {
					if (!isset($_POST['login'])) {
						$this->renderizarLogin($tabela);
						return false;
					} else {
						foreach ($_POST as $campoDoForm => $valorDoForm) {
							foreach ($tabela->camposParaAutenticacao as $campo) {
								if ($campoDoForm == str_replace(" ", "_", $tabela->nome . "_" . $campo->nome)) {
									$campo->valor = $valorDoForm;
									break;
								}
							}
						}
						$query = "SELECT id, `" . $tabela->campoBemVindo->nome . "` FROM `" . $tabela->nome . "` WHERE ";
						foreach ($tabela->camposParaAutenticacao as $campo) {
							$query .= "`" . $campo->nome . "` = ";
							switch ($campo->tipoConfig) {
								case "Texto":
									$query .= "'" . $campo->valor . "'";
									break;
								case "Senha":
									$query .= "MD5('" . $campo->valor . "')";
									break;
							}
							$query .= " AND";
						}
						$query = substr($query, 0, strlen($query) - 4);
						$result = mysql_query($query, $this->configBase->conn);
						if (mysql_num_rows($result) == 0) {
							$this->renderizarLogin($tabela, "Erro ao logar. Por favor, entre novamente.");
							return false;
						} else {
							$_SESSION['id'] = mysql_result($result, 0, 0);
							$_SESSION['bemVindo'] = mysql_result($result, 0, 1);
							$_SESSION['tabelaAutenticacao'] = $tabela->nome;
							return true;
						}
					}
				}
			}
		}
		if (isset($_POST["Cadastro"])) {
			foreach ($this->tabelas as $tabela) {
				if ($tabela->nome == $_POST["Cadastro"]) {
					$this->acaoAtual = $_POST["acao"];
					$this->tabelaAtual = $tabela;
					if (isset($_POST['id'])) {
						$this->tabelaAtual->id = $_POST['id'];
					}
					if (isset($_POST['pagina']) && is_numeric($_POST['pagina'])) {
						$this->tabelaAtual->paginaAtual = $_POST['pagina'];
					}					
					break;
				}
			}
		} 
		if (isset($_GET['Relatorios'])) {
			foreach ($this->relatorios as $relatorio) {
				if (isset($_POST['Relatorio']) && $relatorio->nome == $_POST['Relatorio']) {
					$this->relatorioAtual = $relatorio;
				}
			}
		}
		return true;
	}
	
	function renderizarLogin($tabela, $mensagem = "") {
		$conteudo = "<div id='divLogin'>";
		$conteudo .= "<form action='?' method='post'>";
		$conteudo .= "<input type='hidden' name='login' value='1'/>";
		$conteudo .= "Login ao Sistema Fácil<br/>";
		foreach ($tabela->camposParaAutenticacao as $campo) {
			$conteudo .= $campo->renderizar() . "<br/>";
		}
		if ($mensagem) {
			$conteudo .= $mensagem . "<br/>";
		}
		$conteudo .= "<input type='submit' value='Logar'/>";
		$conteudo .= "</form>";
		$conteudo .= "</div>";
		$this->conteudo = $conteudo;
		include("Templates/" . $this->template . ".php");
	}
	
	function renderizarConteudo() {
		$conteudo = "";
		if ($this->tabelaAtual) {
			switch ($this->acaoAtual) {
				case "Novo":
					$this->tabelaAtual->verificarValores();
					$conteudo = "<form action='?' method='post' enctype='multipart/form-data' onsubmit='javascript:return validarFormulario()'>";
					$conteudo .= "<input type='hidden' name='Cadastro' value='" . $this->tabelaAtual->nome . "'/>";
					$conteudo .= "<input type='hidden' name='acao' value='Criar'/>";
					foreach ($this->tabelaAtual->campos as $campo) {
						$conteudo .= $campo->renderizar() . "<br/>";
					}
					if ($this->tabelaAtual->usarParaRestricaoMenu) {
						$conteudo .= $this->tabelaAtual->renderizarCamposRestricaoMenu();
					}
					$conteudo .= "<input type='button' value='Voltar' onclick='javascript:request(\"" . $this->tabelaAtual->nome . "\",\"\",\"\");return false'/>";
					if ($this->verificarPermissao("criar")) {
						$conteudo .= "<input type='submit' value='Salvar'/>";
					}
					$conteudo .= "</form>";
					$this->conteudo = $conteudo;
					break;
				case "Criar":
					$this->tabelaAtual->criar($_POST);
					$this->redirecionarParaListagem($this->tabelaAtual);
					break;
				case "Editar":
					$this->tabelaAtual->buscarDados();
					$this->tabelaAtual->verificarValores();
					$conteudo = "<form action='?' method='post' enctype='multipart/form-data' onsubmit='javascript:return validarFormulario()'>";
					$conteudo .= "<input type='hidden' name='Cadastro' value='" . $this->tabelaAtual->nome . "'/>";
					$conteudo .= "<input type='hidden' name='acao' value='Atualizar'/>";
					$conteudo .= "<input type='hidden' name='id' value='" . $this->tabelaAtual->id . "'/>";
					foreach ($this->tabelaAtual->campos as $campo) {
						if (!$this->verificarPermissao("alterar")) {
							$campo->editavel = false;
						}
						$conteudo .= $campo->renderizar() . "<br/>";
					}
					if ($this->tabelaAtual->usarParaRestricaoMenu) {
						$conteudo .= $this->tabelaAtual->renderizarCamposRestricaoMenu();
					}
					$conteudo .= "<input type='button' value='Voltar' onclick='javascript:request(\"" . $this->tabelaAtual->nome . "\",\"\",\"\");return false'/>";
					if ($this->verificarPermissao("alterar")) {
						$conteudo .= "<input type='submit' value='Salvar'/>";
					}
					if ($this->verificarPermissao("excluir")) {
						$conteudo .= "<input type='button' value='Excluir' onclick='javascript:excluir(\"" . $this->tabelaAtual->nome . "\"," . $this->tabelaAtual->id . ")'/>";
					}
					$conteudo .= "</form>";
					$conteudo .= "<iframe id='ifDownload' name='ifDownload'></iframe>";
					$this->conteudo = $conteudo;
					break;
				case "Atualizar":
					$this->tabelaAtual->atualizar($_POST);
					$this->redirecionarParaListagem($this->tabelaAtual);
					break;
				case "Excluir":
					$this->tabelaAtual->excluir($_POST['id']);
					$this->redirecionarParaListagem($this->tabelaAtual);
					break;
				case "Download":
					$this->renderizarTemplate = false;
					$pathArquivo = $this->configBase->pathUpload . "/" . $this->tabelaAtual->nome . "/" . $this->tabelaAtual->id . "/" . $_POST['arquivo'];
					header("Cache-Control: public");
			     	header("Content-Description: File Transfer");
				    header("Content-Disposition: attachment; filename=" . $_POST['arquivo']);
				    header("Content-Type: application/force-download");
				    header("Content-Transfer-Encoding: binary");
					readfile($pathArquivo);
					break;
				default:
					$clausula = "";
					if (!$this->tabelaAtual->restricoesListagem) {
						$clausula = " WHERE ";
					} else {
						$clausula = " AND ";
					}
					if (count($this->tabelaAtual->camposFiltro) > 0) {
						$conteudo .= "<div class='formFiltro'>";
						$formFiltro = $this->renderizarFormRequest(true);
						$camposFormFiltro = "";
						$this->tabelaAtual->popularCampos($_POST);
						foreach ($this->tabelaAtual->camposFiltro as $campoFiltro) {
							$campoFiltro->editavel = true;
							$campoFiltro->valorPadrao = "";
							$campoFiltro->nomeCampoEdicaoCondicional = "";
							$camposFormFiltro .= $campoFiltro->renderizar();
							if ($campoFiltro->valor) {
								$this->tabelaAtual->restricoesListagem .= $clausula;
								$this->tabelaAtual->restricoesListagem .= "`" . $campoFiltro->tabela->nome . "`.`" . $campoFiltro->nome . "`";
								switch ($campoFiltro->tipoConfig) {
									case "Texto":
										$this->tabelaAtual->restricoesListagem .= " LIKE '%" . $campoFiltro->valor . "%' ";
										break;
									default:
										$this->tabelaAtual->restricoesListagem .= " = '" . $campoFiltro->valor . "' ";
										break;
								}
								$clausula = " AND ";
							}
						}
						//echo $this->tabelaAtual->restricoesListagem;
						$camposFormFiltro .= "<input type='submit' value='Pesquisar'>";
						$formFiltro = str_replace("##CAMPOS DE FILTRO##",$camposFormFiltro,$formFiltro);
						$conteudo .= $formFiltro . "</div><br/>";
						$conteudo .= "<script type='text/javascript'>$('#Cadastro').val('" . $this->tabelaAtual->nome . "');</script>";
					}
					$tamanhoLI = round(100 / count($this->tabelaAtual->camposNaLista), 0);
					$conteudo .= "<div style='text-align: center; width: 100%'><div class='divListaConteudo'>";
					$conteudo .= "<ul class='ulCabecalhoListaConteudo'>";
					foreach ($this->tabelaAtual->camposNaLista as $campo) {
						$conteudo .= "<li style='width: $tamanhoLI%'>";
						$conteudo .= $campo->nome;
						$conteudo .= "</li>";
					}
					$conteudo .= "</ul>";
					$camposQuery = "";
					$innerJoin = "";
					foreach ($this->tabelaAtual->camposNaLista as $campo) {
						if ($campo->mostrarCampo) {
							$camposQuery .= "`" . $campo->tipoConfig . "`.`" . $campo->mostrarCampo . "` AS `" . $campo->tipoConfig . "_" . $campo->mostrarCampo . "` ,";
							$innerJoin .= "LEFT JOIN `" . $campo->tipoConfig . "` ON `" . $campo->tabela->nome . "`.`" . $campo->nome . "` = `" . $campo->tipoConfig . "`.`id` ";
						} else {
							$camposQuery .= "`" . $campo->tabela->nome . "`.`" . $campo->nome . "` AS `" . $campo->tabela->nome . "_" . $campo->nome . "` ,";
						}
					}
					$camposQuery = substr($camposQuery, 0, strlen($camposQuery) - 1);
					$query = "SELECT `" . $this->tabelaAtual->nome . "`.id, ";
					$query .= $camposQuery;
					$query .= " FROM `" . $this->tabelaAtual->nome . "` ";
					
					if ($innerJoin) $query .= $innerJoin;
					if ($this->tabelaAtual->restricoesListagem) $query .= $this->tabelaAtual->restricoesListagem;
					//echo $query;
					//echo $this->tabelaAtual->restricoesListagem;
					
					$result = mysql_query($query, $this->configBase->conn);
					$qtdeRegistros = mysql_num_rows($result);
					$inicio = $this->tabelaAtual->paginaAtual * $this->tabelaAtual->registrosPorPagina - $this->tabelaAtual->registrosPorPagina;
					$i = 0;
					$corlinha = "";
					while ($registro = mysql_fetch_array($result)) {
						if (($i >= $inicio && $i < $this->tabelaAtual->paginaAtual * $this->tabelaAtual->registrosPorPagina) ||
							$this->tabelaAtual->registrosPorPagina == 0) {
							$corlinha = ($corlinha == "#fff" ? "#ffc25e" : "#fff");
							$this->tabelaAtual->id = $registro['id'];
							$conteudo .= "<ul style='background-color: $corlinha' class='ulListaConteudo' onclick='javascript:request(\"" . $this->tabelaAtual->nome . "\",\"Editar\",\"" . $this->tabelaAtual->id . "\");return false;' title='Clique para editar'>";
							foreach ($this->tabelaAtual->camposNaLista as $campo) {
								if ($campo->mostrarCampo) {
									$valor = $registro[$campo->tipoConfig . "_" . $campo->mostrarCampo];
								} else {
									$valor = $registro[$campo->tabela->nome . "_" . $campo->nome];
								}
								$conteudo .= "<li style='width: $tamanhoLI%'>";
								$conteudo .= $valor;
								$conteudo .= "</td>";
							}
							$conteudo .= "</ul>";
						}
						$i++;
					}
					
					$conteudo .= "</div><br/><br/>";
					if ($this->tabelaAtual->registrosPorPagina > 0) {
						$conteudo .= $this->renderizarPaginacao($qtdeRegistros);
					}
					if ($this->verificarPermissao("criar")) {
						$conteudo .= "<input type='button' value='Novo' onclick='javascript:request(\"" . $this->tabelaAtual->nome . "\",\"Novo\",\"\"); return false;'/>";
					}
					$conteudo .= "</div>";
					$this->conteudo = $conteudo;
					break;
			}
		} else if ($this->relatorioAtual) {
			$this->conteudo = $this->relatorioAtual->renderizar();
		} else if (isset($_GET['Relatorios'])) {
			$conteudo = "<div class='relatorios'>";
			foreach ($this->relatorios as $relatorio) {
				$conteudo .= "<a href='#' onclick='javascript:request(\"\",\"\",\"\",\"\",\"\",\"" . $relatorio->nome . "\");return false;'>" . $relatorio->nome . "</a><br/>";
			}
			$conteudo .= "</div>";
			$this->conteudo = $conteudo;
		}
	}
	
	function renderizarPaginacao($qtdeRegistros) {
		$paginacao = "<div class='paginacao'>";
		$totalPaginas = ceil($qtdeRegistros / $this->tabelaAtual->registrosPorPagina);
		if ($this->tabelaAtual->paginaAtual > 1) {
			$paginacao .= "<a href='#' onclick='javascript:request(\"" . $this->tabelaAtual->nome . "\",\"\",\"\",\"\",\"1\");return false;'>Primeira</a>&nbsp;";
			$paginacao .= "<a href='#' onclick='javascript:request(\"" . $this->tabelaAtual->nome . "\",\"\",\"\",\"\",\"" . ($this->tabelaAtual->paginaAtual - 1) . "\");return false;'>Anterior</a>&nbsp;";
		}
		for ($i = 1; $i <= $totalPaginas; $i++) {
			$paginacao .= "<a href='#' onclick='javascript:request(\"" . $this->tabelaAtual->nome . "\",\"\",\"\",\"\",\"" . $i . "\");return false;'>";
			if ($i == $this->tabelaAtual->paginaAtual) $paginacao .= "<b>";
			$paginacao .= $i;
			if ($i == $this->tabelaAtual->paginaAtual) $paginacao .= "</b>";
			$paginacao .= "</a>&nbsp;";
		}
		if ($this->tabelaAtual->paginaAtual < $totalPaginas) {
			$paginacao .= "<a href='#' onclick='javascript:request(\"" . $this->tabelaAtual->nome . "\",\"\",\"\",\"\",\"" . ($this->tabelaAtual->paginaAtual + 1) . "\");return false;'>Próxima</a>&nbsp;";
			$paginacao .= "<a href='#' onclick='javascript:request(\"" . $this->tabelaAtual->nome . "\",\"\",\"\",\"\",\"" . $totalPaginas . "\");return false;'>Última</a>&nbsp;";
		}
		$paginacao .= "</div><br/>";
		return $paginacao;
	}
	
	function redirecionarParaListagem($tabela) {
		$this->conteudo = $this->renderizarFormRequest() . "<script type='text/javascript'>request('" . $tabela->nome . "','','');</script>";
	}
	
	function verificarPermissao($acao) {
		if ($this->configBase->tabelaParaRestricaoMenu && $this->configBase->tabelaParaAutenticacao) {
			$idRestricao = "";
			if ($this->configBase->tabelaParaAutenticacao->nome == $this->configBase->tabelaParaRestricaoMenu->nome) {
				$idRestricao = $_SESSION['id'];
			} else {
				foreach ($this->configBase->tabelaParaAutenticacao->campos as $campo) {
					if ($campo->tipoConfig == $this->configBase->tabelaParaRestricaoMenu->nome) {
						$query = "SELECT `" . $campo->nome . "` FROM `" . $this->configBase->tabelaParaAutenticacao->nome . "` WHERE id = " . $_SESSION['id'];
						$result = mysql_query($query, $this->configBase->conn);
						$idRestricao = mysql_result($result, 0);
						break;
					}
				}
			}
			$query = "SELECT $acao FROM `" . $this->configBase->tabelaParaRestricaoMenu->nome . "_X_Menu` WHERE `" . $this->configBase->tabelaParaRestricaoMenu->nome . "Id` = " . $idRestricao;
			$query .= " AND menu = '" . $this->tabelaAtual->nome . "'";
			//echo $query;
			$result = mysql_query($query, $this->configBase->conn);
			return mysql_result($result, 0, 0);
		} else {
			return true;
		}
	}
}
?>